Юлий Цезарь использовал свой способ
шифрования текста. Каждая буква заменялась на следующую по алфавиту через k позиций по кругу. Необходимо по заданной
шифровке определить исходный текст.
Вход. В первой строке дана шифровка, состоящая
из не более чем 255 заглавных латинских
букв. Вторая строка содержит число k (1 ≤ k ≤ 10).
Выход. Вывести результат расшифровки.
Пример
входа |
Пример
выхода |
XPSE 1 |
WORD |
строки
Анализ алгоритма
Для расшифровки
следует каждую букву прокрутить на k позиций
назад по кругу. Пронумеруем буквы от 0 (‘A’)
до 25 (‘Z’).
Пусть
s[i]
– текущая буква шифра. Тогда номер буквы равен s[i] –
‘A’. Вычтем из нее число k
по кругу (перед ‘A’ идет
‘Z’),
получим (s[i] – ‘A’ – k + 26) % 26. Осталось
прибавить к ней ‘A’, получив ASCII код.
Таким образом операция дешифрования имеет вид:
s[i] = (s[i]
– ‘A’ – k + 26) % 26 + ‘A’
Реализация алгоритма
Входную
строку содержим в символьном массиве s.
char s[1000];
Читаем входные данные.
gets(s); scanf("%d", &k);
Пересчитываем символы строки согласно
шифру.
for (i = 0; i < strlen(s); i++)
s[i] = (((s[i] - 'A') + 26
- k) % 26) + 'A';
Выводим результат расшифровки.
puts(s);
Реализация алгоритма – STL
#include <iostream>
#include <string>
using namespace std;
string s;
int i, k;
int main(void)
{
cin >> s >> k;
for (i = 0; i < s.size();
i++)
s[i] = (((s[i] - 'A') + 26 - k) % 26) + 'A';
cout << s << endl;
return 0;
}